import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;

/**
 * Write a description of class Espacio here.
 * 
 * @author (Fco Fernando Gosch Acosta) 
 * @version (1.0)
 */
public class Espacio extends World
{
    GreenfootSound pierde = new GreenfootSound("pierde.wav");
    GreenfootSound ganaste = new GreenfootSound("ganaste.wav");
    GreenfootSound subenivel = new GreenfootSound("subenivel.wav");
    GreenfootImage nivel2 = new GreenfootImage("nivel2.jpg");
    GreenfootImage nivel3 = new GreenfootImage("nivel3.jpg");
    GreenfootImage nivel4 = new GreenfootImage("nivel4.jpg");
    GreenfootImage nivel5 = new GreenfootImage("nivel5.jpg");
    
    private Counter counter; //contador para recursos
    private Counter counter2; // contador para la vida del sol
    private Counter counter3; // contador para los puntos del jugador
    private Counter counter8; // Contador para nivel
    private Counter counter9; // Contador para el numero de enemigos
    private SimpleTimer timer1;
    private SimpleTimer timer2;
    private long lapsoRecurso ;
    private long lapsoEnemigo ;    
    protected static final int maxPos = 4;
    protected Meteorito[] enemigos;
    
    
    protected int enemigoActual;    
    protected static final int numEnemigos = 20;
    private Tierra tierra;    
    protected int posicion[];
    protected int apuPosicion;
  
    /**
     * Constructor for objects of class Espacio.
     * 
     */
    public Espacio()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(800, 550, 1);     
        
        
        timer1 = new SimpleTimer();
        timer1.mark();
        
        timer2 = new SimpleTimer();
        timer2.mark();
        
        int grados = 0;
        apuPosicion = 0;
        posicion = new int[maxPos];
        for(int i = 0; i < maxPos; i++)
        {
            posicion[i] = grados;
            grados = grados + 90;
        }               
        enemigoActual = 0;          
        enemigos = new Meteorito[numEnemigos];
        
        nivel1(enemigos);        
        lapsoRecurso = 4000 ;
        lapsoEnemigo = 4000 ;

        prepare();
    }
    
    /**
     * Metodo bajaRecursos, disminuye los recursos del planeta 
     * una cantidad
     *
     * @param unaCantidad parametro que dice cuanto bajaran los recursos
     */
    public void bajaRecursos(int unaCantidad)
    {
        counter.setValue(counter.getValue() - unaCantidad);
    }
    
    /**
     * Metodo aunmentaRecursos, aumenta los recursos del planeta
     * una cantidad
     *
     * @param unaCantidad parametro que dice cuanto bajaran los recursos
     */
    public void aumentaRecursos(int unaCantidad)
    {
        counter.setValue(counter.getValue() + unaCantidad);
    }
    
    /**
     * Metodo damePuntos para pedir los recursos de la tierra
     *
     * @return regresa los recursos
     */
    public int damePuntos()
    {
        return counter.getValue();
    }
    
    /**
     * Metodo aumentaPuntos para aumentar los puntos del jugador
     *
     * @param unaCantidad A parameter
     */
    public void aumentaPuntos(int unaCantidad)
    {
        counter3.setValue(counter3.getValue() + unaCantidad);
    }
    
    /**
     * Metodo bajaVida le quita una vida al sol
     *
     */
    public void bajaVida()
    {
        counter2.setValue(counter2.getValue() - 1);
    }
    
    /**
     * Metodo aumentaVida le da una vida al sol
     *
     */
    public void aumentaVida()
    {
        counter2.setValue(counter2.getValue() + 1);
    }
    
    /**
     * Metodo bajaEnemigo baja el numero de enemigos restantes
     *
     */
    public void bajaEnemigo()
    {
        counter9.setValue(counter9.getValue() - 1);
    }
    
    /**
     * Metodo perdiste pausa el juego cuando el jugador perdio
     *
     */
    public void perdiste() 
    {
         UserInfo me = UserInfo.getMyInfo();
                if (me != null)
                {
                    if (counter3.getValue() > me.getScore())
                    {
                        me.setScore(counter3.getValue());
                        me.store();
                    }
                }
        addObject(new ScoreBoard(500, 500), getWidth()/2, getHeight()/2);
        pierde.play();
        Back regresa = new Back();

        addObject(regresa, 750,450);        
    }
    
    /**
     * Metodo ganaste pausa el juego cuando el jugador gano
     *
     */
    public void ganaste() 
    {
        UserInfo me = UserInfo.getMyInfo();
                if (me != null)
                {
                    if (counter3.getValue() > me.getScore())
                    {
                        me.setScore(counter3.getValue());
                        me.store();
                    }
                }
        addObject(new ScoreBoard(500, 500), getWidth()/2, getHeight()/2);
        ganaste.play();
        Back regresa = new Back();

        addObject(regresa, 750,450);        
    }
    
    /**
     * Metodo dameXTierra para tomar la posicion de la tierra
     *
     * @return la posicion en X de la tierra
     */
    public int dameXTierra()
    {
        return tierra.getX();
    }
    
     /**
     * Metodo dameUnaPosicion para tomar la posicion del arma en torno a la tierra
     *
     * @return la posicion en grados de la tierra
     */
    public int dameUnaPosicion()
    {
        int i = apuPosicion;
        apuPosicion = apuPosicion + 1;
        return posicion[i];
    }
    
     /**
     * Metodo dameNumArmas para tomar la posicion del arma en torno a la tierra
     *
     * @return el numero de armas en la tierra
     */
    public int dameNumArmas()
    {
        if(apuPosicion == 4)
        {
            return 4;
        }   
        return 0;
    }
    
    /**
     * Metodo dameYTierra para tomar la posicion de la tierra
     *
     * @return la posicion en Y de la tierra
     */
    public int dameYTierra()
    {
        return tierra.getY();
    }
    
    /**
     * Metodo dameAnguloTierra para tomar el angulo de la tierra
     *
     * @return el angulo de la tierra
     */
    public int dameAnguloTierra()
    {
        return tierra.getRotation();
    }
    
    /**
     * Metodo nivel1 crea los enemigos para el nivel 1
     *
     */
    private void nivel1(Meteorito[] enemigos1)
    {
        enemigos1[0] = new Grande(0);
        enemigos1[1] = new Grande(0);
        enemigos1[2] = new Grande(0);
        enemigos1[3] = new Grande(0);
        enemigos1[4] = new Grande(0);
        enemigos1[5] = new Metal(0);
        enemigos1[6] = new Metal(0);
        enemigos1[7] = new Metal(0);
        enemigos1[8] = new Metal(0);
        enemigos1[9] = new Grande(0);
        enemigos1[10] = new Grande(0);
        enemigos1[11] = new Metal(0);
        enemigos1[12] = new Metal(0);
        enemigos1[13] = new Grande(0);
        enemigos1[14] = new Metal(0);
        enemigos1[15] = new Metal(0);
        enemigos1[16] = new Metal(0);
        enemigos1[17] = new Grande(0);
        enemigos1[18] = new Pequenio(0);
        enemigos1[19] = new Pequenio(0);
        
    }
    
    /**
     * Metodo nivel2 crea los enemigos para nivel 2
     *
     */
    private void nivel2(Meteorito[] enemigos2)
    {
        enemigos2[0] = new Grande(0);
        enemigos2[1] = new Pulido(0);
        enemigos2[2] = new Pequenio(0);
        enemigos2[3] = new Pequenio(0);
        enemigos2[4] = new Pequenio(0);
        enemigos2[5] = new Pulido(0);
        enemigos2[6] = new Metal(0);
        enemigos2[7] = new Metal(0);
        enemigos2[8] = new Pulido(0);
        enemigos2[9] = new Grande(0);
        enemigos2[10] = new Pequenio(0);
        enemigos2[11] = new Pulido(0);
        enemigos2[12] = new Metal(0);
        enemigos2[13] = new Grande(0);
        enemigos2[14] = new Metal(0);
        enemigos2[15] = new Pequenio(0);
        enemigos2[16] = new Pequenio(0);
        enemigos2[17] = new Grande(0);
        enemigos2[18] = new Pulido(0);
        enemigos2[19] = new Pulido(0);        
    }
    
     /**
     * Metodo nivel3 crea los enemigos para nivel 3
     *
     */
    private void nivel3(Meteorito[] enemigos3)
    {
        enemigos3[0] = new Pulido(0);
        enemigos3[1] = new Pulido(0);
        enemigos3[2] = new Pequenio(0);
        enemigos3[3] = new Pequenio(0);
        enemigos3[4] = new Pequenio(0);
        enemigos3[5] = new Pulido(0);
        enemigos3[6] = new Metal(0);
        enemigos3[7] = new Metal(0);
        enemigos3[8] = new Pulido(0);
        enemigos3[9] = new Pequenio(0);
        enemigos3[10] = new Pequenio(0);
        enemigos3[11] = new Pulido(0);
        enemigos3[12] = new Metal(0);
        enemigos3[13] = new Grande(0);
        enemigos3[14] = new Metal(0);
        enemigos3[15] = new Pequenio(0);
        enemigos3[16] = new Pequenio(0);
        enemigos3[17] = new Metal(0);
        enemigos3[18] = new Pulido(0);
        enemigos3[19] = new Pulido(0);     
    }
    
     /**
     * Metodo nivel4 crea los enemigos para nivel 4
     *
     */    
    private void nivel4(Meteorito[] enemigos4)
    {
        enemigos4[0] = new Pulido(0);
        enemigos4[1] = new Pulido(0);
        enemigos4[2] = new Metal(0);
        enemigos4[3] = new Pequenio(0);
        enemigos4[4] = new Pequenio(0);
        enemigos4[5] = new Pulido(0);
        enemigos4[6] = new Pequenio(0);
        enemigos4[7] = new Pulido(0);
        enemigos4[8] = new Pulido(0);
        enemigos4[9] = new Pequenio(0);
        enemigos4[10] = new Pequenio(0);
        enemigos4[11] = new Pulido(0);
        enemigos4[12] = new Pequenio(0);
        enemigos4[13] = new Pequenio(0);
        enemigos4[14] = new Pequenio(0);
        enemigos4[15] = new Pequenio(0);
        enemigos4[16] = new Pequenio(0);
        enemigos4[17] = new Pulido(0);
        enemigos4[18] = new Pulido(0);
        enemigos4[19] = new Pequenio(0);        
    } 
    
    /**
     * Metodo nivel5 crea los enemigos para nivel 5
     *
     */    
    private void nivel5(Meteorito[] enemigos5)
    {
        enemigos5[0] = new Pequenio(0);
        enemigos5[1] = new Pequenio(0);
        enemigos5[2] = new Pequenio(0);
        enemigos5[3] = new Pequenio(0);
        enemigos5[4] = new Pequenio(0);
        enemigos5[5] = new Pequenio(0);
        enemigos5[6] = new Pequenio(0);
        enemigos5[7] = new Pequenio(0);
        enemigos5[8] = new Pequenio(0);
        enemigos5[9] = new Pequenio(0);
        enemigos5[10] = new Pequenio(0);
        enemigos5[11] = new Pequenio(0);
        enemigos5[12] = new Pequenio(0);
        enemigos5[13] = new Pequenio(0);
        enemigos5[14] = new Pequenio(0);
        enemigos5[15] = new Pequenio(0);
        enemigos5[16] = new Pequenio(0);
        enemigos5[17] = new Pequenio(0);
        enemigos5[18] = new Pequenio(0);
        enemigos5[19] = new Pequenio(0);        
    }
    
    /**
     * Metodo pulsoEnEspacio para checar si dio click en el espacio
     *
     * @return regresa si hiso click o no en el espacio
     */
    public boolean pulsoEnEspacio()
    {
         if(Greenfoot.mouseClicked(this))
         {
             return true;
         }
         return false;   
    }
        
    
    /**
     * Metodo sacaEnemigo Saca un enemigo de la lista de enemigos y lo 
     * pone en el espacio
     *
     * @param enemigos cadena de enemigos de la cual se tomara el enemigo
     * @param elEnemigo enemigo actual a sacar en la lista de enemigos
     * @return el enemigo actual en el cual quedaria el jugador
     */
    public int sacaEnemigo(Meteorito[] enemigos, int elEnemigo)
    {
        if(timer2.millisElapsed() > lapsoEnemigo )
        {
            int x = Greenfoot.getRandomNumber (2);
            int y = Greenfoot.getRandomNumber (2);
            if( x == 0 && y == 0)
                addObject(enemigos[elEnemigo], 150, 0);
            else if( x == 0 && y == 1)
            {
                enemigos[elEnemigo].setRotation(270);
                addObject(enemigos[elEnemigo],250, 500);
            }
            else if( x == 1 && y == 0)
            {
                enemigos[elEnemigo].setRotation(80);
                addObject(enemigos[elEnemigo], 800, 0);
            }
            else if( x == 1 && y == 1)
            {
                enemigos[elEnemigo].setRotation(170);
                addObject(enemigos[elEnemigo], 150, 500);
            }
            timer2.mark();
            elEnemigo = elEnemigo + 1;
            return elEnemigo;
        }
        return elEnemigo;
    }
    
    /**
     * Prepare the world for the start of the program. That is: create the initial
     * objects and add them to the world.
     */
    private void prepare()
    {
        Sol sol = new Sol();
        addObject(sol, 460, 250);
        tierra = new Tierra();
        addObject(tierra, 460, 141);        
        Menu menu = new Menu();
        addObject(menu, 65, 283);
        menu.setLocation(58, 275);

        counter = new Counter("Resources: ");
        counter2 = new Counter("Sun Life: ");
        counter3 = new Counter("Score: ");         
        Counter counter4 = new Counter("Price: ");                
        Counter counter5 = new Counter("Price: ");
        Counter counter6 = new Counter("Price: ");
        Counter counter7 = new Counter("Price: ");     
        counter8 = new Counter("Level: ");
        counter9 = new Counter("#Enemy: "); 

        addObject(counter, 59, 13);
        addObject(counter2, 59, 47);
        addObject(counter3, 59, 79);
        addObject(counter4, 52, 216);
        addObject(counter5, 53, 304);
        addObject(counter6, 49, 388);
        addObject(counter7, 53, 479);
        addObject(counter8, 59, 112);
        addObject(counter9, 54, 140);

        counter.setValue(300);       
        counter2.setValue(5);
        counter4.setValue(250);
        counter5.setValue(300);        
        counter6.setValue(100);
        counter7.setValue(150);
        counter8.setValue(1);
        counter9.setValue(20);

        
        PonLaser ponlaser = new PonLaser();
        PonLanzaMisiles ponlanzamisiles = new PonLanzaMisiles();
        PonPistola ponpistola = new PonPistola();
        PonMagnetico ponmagnetico = new PonMagnetico();

        addObject(ponlaser, 47, 183);        
        addObject(ponlanzamisiles, 28, 262);       
        addObject(ponpistola, 34, 345);       
        addObject(ponmagnetico, 33, 435);       
    }
    
    public void act()
    {
        if(enemigoActual < numEnemigos && counter8.getValue() == 1 )
        {
            enemigoActual = sacaEnemigo(enemigos,enemigoActual);
            
        }
        
        else if(enemigoActual < numEnemigos && counter8.getValue()==2)
        {
            enemigoActual = sacaEnemigo(enemigos,enemigoActual);
        }
        
        else if(enemigoActual < numEnemigos && counter8.getValue()==3)
        {
            enemigoActual = sacaEnemigo(enemigos,enemigoActual);
        }
        
         else if(enemigoActual < numEnemigos && counter8.getValue()==4)
        {
            enemigoActual = sacaEnemigo(enemigos,enemigoActual);
        }
         else if(enemigoActual < numEnemigos && counter8.getValue()==5)
        {
            enemigoActual = sacaEnemigo(enemigos,enemigoActual);
        }
        
        if(timer1.millisElapsed() > lapsoRecurso )
        {
            aumentaRecursos(30);
            timer1.mark();
        }        
        
        if(counter2.getValue() == 0)
        {   
            perdiste();
        }        
                
        if(enemigoActual == numEnemigos )
        {
            counter8.setValue(counter8.getValue() + 1);
            int nivel = counter8.getValue();
            counter9.setValue(numEnemigos);   
            lapsoEnemigo = lapsoEnemigo - 600;
            lapsoRecurso = lapsoRecurso + 500;
            enemigoActual = 0;
            
            switch(nivel)
            {
                case 2:
                    setBackground(nivel2);
                    nivel2(enemigos);
                    break;
                case 3:
                    setBackground(nivel3);
                    nivel3(enemigos);
                    break;
                case 4:
                    setBackground(nivel4);
                    nivel4(enemigos);
                    break;
                case 5:
                    setBackground(nivel5);
                    nivel5(enemigos);
                    break;
            }
            subenivel.play();
        }   
        
        if(enemigoActual == 0&& counter8.getValue() == 5)
        {
            ganaste();
        }
    }
}
